package com.redepronik.negosysfab.invfac.report;

import static com.redepronik.negosys.utils.Utils.fechaFormatoDate;
import static com.redepronik.negosys.utils.Utils.fechaFormatoString;
import static com.redepronik.negosys.utils.Utils.presentaMensaje;
import static com.redepronik.negosys.utils.Utils.valorConIva;

import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.redepronik.negosys.invfac.entity.Detalleegreso;
import com.redepronik.negosys.invfac.entity.Egreso;
import com.redepronik.negosys.invfac.entity.Producto;
import com.redepronik.negosys.invfac.entityAux.Fechas;
import com.redepronik.negosys.invfac.entityAux.ListasVolumenVentaProductoAnio;
import com.redepronik.negosys.invfac.entityAux.ListasVolumenVentaProductoMes;
import com.redepronik.negosys.invfac.entityAux.ListasVolumenVentaProductoSemana;
import com.redepronik.negosys.invfac.entityAux.PersonaCedulaNombre;
import com.redepronik.negosys.invfac.entityAux.VolumenVentaProductoAnio;
import com.redepronik.negosys.invfac.entityAux.VolumenVentaProductoMes;
import com.redepronik.negosys.invfac.entityAux.VolumenVentaProductoSemana;
import com.redepronik.negosys.invfac.service.EgresoService;
import com.redepronik.negosys.invfac.service.LocalService;
import com.redepronik.negosys.invfac.service.MoraService;
import com.redepronik.negosys.invfac.service.ProductoService;
import com.redepronik.negosys.invfac.service.TipoDocumentoService;
import com.redepronik.negosys.rrhh.entity.Persona;
import com.redepronik.negosys.rrhh.service.CiudadService;
import com.redepronik.negosys.rrhh.service.ClienteService;
import com.redepronik.negosys.rrhh.service.EmpleadoService;
import com.redepronik.negosys.rrhh.service.PersonaService;
import com.redepronik.negosys.rrhh.service.ProvinciaService;
import com.redepronik.negosys.utils.service.ReporteService;

@Controller
@Scope("session")
public class EgresoReporteGerencial {

	@Autowired
	private CiudadService ciudadService;
	@Autowired
	private ClienteService clienteService;
	@Autowired
	private EgresoService egresoService;
	@Autowired
	private EmpleadoService empleadoService;
	@Autowired
	private MoraService moraService;
	@Autowired
	private PersonaService personaService;
	@Autowired
	private ProductoService productoService;
	@Autowired
	private ProvinciaService provinciaService;
	@Autowired
	private ReporteService reporteService;

	private int anioCa;
	private int anioCm;
	private int anioVvpm;
	private int anioVvps;
	private int mesCm;
	private int mesVvps;
	private int vendedorCa;
	private int vendedorCd;
	private int vendedorCm;
	private Date fechaFin;
	private Date fechaFinCd;
	private Date fechaInicio;
	private Date fechaInicioCd;
	private List<Producto> listaProductos;
	private List<PersonaCedulaNombre> listaVendedores;
	private List<Producto> listaVcProductos;
	private Producto productoVvpd;
	private Producto productoVvpm;
	private Producto productoVvps;

	@Autowired
	LocalService localService;

	@Autowired
	TipoDocumentoService tipoDocumentoService;

	public EgresoReporteGerencial() {
	}

	public List<Fechas> calcularFechas(int tipoCalculo, int anio, int mes,
			Date fi, Date ff) {
		List<Fechas> listaFechas = new ArrayList<Fechas>();
		Calendar c = GregorianCalendar.getInstance();

		if (tipoCalculo == 1) {
			c.setTime(fi);
			long fechaInicialMs = fi.getTime();
			long fechaFinalMs = ff.getTime();
			long diferencia = fechaFinalMs - fechaInicialMs;
			int dias = (int) Math.floor(diferencia / (1000 * 60 * 60 * 24));
			for (int i = 1; i <= dias + 1; i++) {
				listaFechas.add(new Fechas(c.getTime(), c.getTime()));
				c.add(Calendar.DAY_OF_YEAR, 1);
			}
		} else if (tipoCalculo == 2) {
			Date fecha = fechaFormatoDate("01/" + mes + "/" + anio);
			c.setTime(fecha);
			int dm = c.getActualMaximum(Calendar.DAY_OF_MONTH);
			Fechas f = new Fechas();
			for (int i = 1; i <= dm; i++) {
				if (i == 1 || c.get(Calendar.DAY_OF_WEEK) == 2)
					f.setFechaInicio(c.getTime());

				if (i == dm || c.get(Calendar.DAY_OF_WEEK) == 7)
					f.setFechaFin(c.getTime());

				if (f.getFechaFin() != null) {
					listaFechas.add(f);
					f = new Fechas();
				}
				c.add(Calendar.DAY_OF_YEAR, 1);
			}
		} else if (tipoCalculo == 3) {
			Date fechaInicio = com.redepronik.negosys.utils.Utils
					.fechaFormatoDate("01/01/" + anio);
			c.setTime(fechaInicio);
			c.set(Calendar.DAY_OF_MONTH,
					c.getActualMaximum(Calendar.DAY_OF_MONTH));
			Date fechaFin = c.getTime();
			Fechas f = new Fechas(fechaInicio, fechaFin);
			listaFechas.add(f);

			for (int i = 2; i <= 12; i++) {
				c.add(Calendar.DAY_OF_YEAR, 1);
				fechaInicio = c.getTime();
				c.set(Calendar.DAY_OF_MONTH,
						c.getActualMaximum(Calendar.DAY_OF_MONTH));
				fechaFin = c.getTime();
				f = new Fechas(fechaInicio, fechaFin);
				listaFechas.add(f);
			}
		}
		return listaFechas;
	}

	public void generarRegistros() {
		for (int i = 1; i <= 100; i++) {
			for (int j = 0; j < listaVendedores.size(); j++) {
				Egreso e = new Egreso();
				e.setActivo(true);
				e.setCajeroid(empleadoService
						.obtenerEmpleadoCargoPorCedulaAndCargo("0704868462", 4));
				e.setCliente(clienteService.obtenerPorCedula("0700000001")
						.getCliente());
				e.setClienteFactura(clienteService.obtenerPorCedula(
						"0700000001").getCliente());
				e.setCodigodocumento(String.valueOf(i));
				e.setDescuento(new BigDecimal("0"));
				e.setDevolucion(false);
				e.setFacturainterna(false);

				Calendar c = GregorianCalendar.getInstance();
				Date date = null;

				do {
					int dia = 0;
					int mes = (int) (Math.random() * 13);
					if (mes == 1 || mes == 3 || mes == 5 || mes == 7
							|| mes == 8 || mes == 10 || mes == 12)
						dia = (int) (Math.random() * (31 - 1) + 1);
					else if (mes == 4 || mes == 6 || mes == 9 || mes == 11)
						dia = (int) (Math.random() * (30 - 1) + 1);
					else
						dia = (int) (Math.random() * (28 - 1) + 1);

					String fecha = dia + "/" + mes + "/2014";
					date = fechaFormatoDate(fecha);
					e.setFechainicio(com.redepronik.negosys.utils.Utils
							.timestamp(date));
					c.setTime(date);
				} while (c.get(Calendar.DAY_OF_WEEK) == 1
						|| date.compareTo(fechaFormatoDate("01/01/2014")) < 0);

				e.setLocal(localService.obtenerPorLocalId(1));
				e.setPadre(0L);
				e.setPagado(false);

				int r = (int) (Math.random() * (100 - 1) + 1);
				if (r >= 1 && r <= 50)
					e.setTipodocumento(tipoDocumentoService.obtenerPorId(1));
				else
					e.setTipodocumento(tipoDocumentoService.obtenerPorId(8));

				// int v = (int) (Math.random() * (listaVendedores.size() - 0) +
				// 0);
				e.setVendedorid(empleadoService
						.obtenerEmpleadoCargoPorCedulaAndCargo(listaVendedores
								.get(j).getCedula(), 5));

				e.setDetalleegresos(new ArrayList<Detalleegreso>());
				int o = 1;
				for (Producto p : listaProductos) {
					Detalleegreso de = new Detalleegreso();
					de.setCantidad((int) (Math.random() * (500 - 100) + 100));
					de.setDescuento(new BigDecimal("0"));
					de.setEgreso(e);
					de.setEliminar(false);
					de.setIva(true);
					de.setOrden(o++);
					if (p.getProductoid() == 4) {
						int t = (int) (Math.random() * (4 - 1) + 1);
						if (t == 1)
							de.setPreciocosto(new BigDecimal("0.759"));
						else if (t == 2)
							de.setPreciocosto(new BigDecimal("0.803571"));
						else if (t == 3)
							de.setPreciocosto(new BigDecimal("0.892857"));
					} else
						de.setPreciocosto(p.getPrecio());

					de.setPrecioventa(de.getPreciocosto());
					de.setProducto(p);
					de.setPromocion(false);
					e.addDetalleegreso(de);
				}
				egresoService.insertar(e);
			}
		}
	}

	public int getAnioCa() {
		return anioCa;
	}

	public int getAnioCm() {
		return anioCm;
	}

	public int getAnioVvpm() {
		return anioVvpm;
	}

	public int getAnioVvps() {
		return anioVvps;
	}

	public Date getFechaFin() {
		return fechaFin;
	}

	public Date getFechaFinCd() {
		return fechaFinCd;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public Date getFechaInicioCd() {
		return fechaInicioCd;
	}

	public List<Producto> getListaProductos() {
		return listaProductos;
	}

	public List<Producto> getListaVcProductos() {
		return listaVcProductos;
	}

	public List<PersonaCedulaNombre> getListaVendedores() {
		return listaVendedores;
	}

	public int getMesCm() {
		return mesCm;
	}

	public int getMesVvps() {
		return mesVvps;
	}

	public Producto getProductoVvpd() {
		return productoVvpd;
	}

	public Producto getProductoVvpm() {
		return productoVvpm;
	}

	public Producto getProductoVvps() {
		return productoVvps;
	}

	public int getVendedorCa() {
		return vendedorCa;
	}

	public int getVendedorCd() {
		return vendedorCd;
	}

	public int getVendedorCm() {
		return vendedorCm;
	}

	@PostConstruct
	public void init() {
		listaVcProductos = new ArrayList<Producto>();
		listaVcProductos.add(productoService.obtenerPorEan("0001"));

		listaVcProductos.add(productoService.obtenerPorEan("0007"));

		listaVcProductos.add(productoService.obtenerPorEan("0002"));
		listaVcProductos.add(productoService.obtenerPorEan("0003"));
		listaVcProductos.add(productoService.obtenerPorEan("0004"));
		listaVcProductos.add(productoService.obtenerPorEan("0005"));
		listaVcProductos.add(productoService.obtenerPorEan("0006"));

		listaVendedores = empleadoService.obtenerPorCargo(5);
		listaProductos = productoService.obtener();
		productoVvpd = new Producto();
		productoVvps = new Producto();
		productoVvpm = new Producto();
		// generarRegistros();
	}

	public Object obtenerRegistro(int tipoConsulta, Producto producto,
			String nombreImprimir, long productoId, List<Fechas> lf,
			BigDecimal precio, int vendedorId) {

		Object vvp = null;

		if (tipoConsulta == 1) {
			vvp = new VolumenVentaProductoSemana();
			((VolumenVentaProductoSemana) vvp).setNombre(nombreImprimir);
		} else if (tipoConsulta == 2) {
			vvp = new VolumenVentaProductoMes();
			((VolumenVentaProductoMes) vvp).setNombre(nombreImprimir);

		} else if (tipoConsulta == 3) {
			vvp = new VolumenVentaProductoAnio();
			((VolumenVentaProductoAnio) vvp).setNombre(nombreImprimir);
		}

		try {
			Method metodo = null;
			int i = 1;
			for (Fechas fechas : lf) {
				if (tipoConsulta == 1)
					metodo = VolumenVentaProductoSemana.class.getMethod("setD"
							+ i++, new Class[] { int.class });
				else if (tipoConsulta == 2)
					metodo = VolumenVentaProductoMes.class.getMethod("setS"
							+ i++, new Class[] { int.class });
				else if (tipoConsulta == 3)
					metodo = VolumenVentaProductoAnio.class.getMethod("setMes"
							+ i++, new Class[] { int.class });

				if (precio.compareTo(new BigDecimal("0")) == 0) {
					if (vendedorId == 0)
						metodo.invoke(
								vvp,
								egresoService
										.obtenerCantidadPorProductoOrVendedor(
												productoId,
												fechas.getFechaInicio(),
												fechas.getFechaFin(), 0)
										.getCantidad());
					else
						metodo.invoke(
								vvp,
								egresoService
										.obtenerCantidadPorProductoOrVendedor(
												productoId,
												fechas.getFechaInicio(),
												fechas.getFechaFin(),
												vendedorId).getCantidad());
				} else {
					if (vendedorId == 0)
						metodo.invoke(
								vvp,
								egresoService
										.obtenerCantidadPorProductoPrecioOrVendedor(
												productoId,
												fechas.getFechaInicio(),
												fechas.getFechaFin(), precio, 0)
										.getCantidad());
					else
						metodo.invoke(
								vvp,
								egresoService
										.obtenerCantidadPorProductoPrecioOrVendedor(
												productoId,
												fechas.getFechaInicio(),
												fechas.getFechaFin(), precio,
												vendedorId).getCantidad());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return vvp;
	}

	public void reporteConsolidadoVentaDiaria() {
		Calendar c = GregorianCalendar.getInstance();
		c.setTime(fechaInicioCd);
		c.add(Calendar.DAY_OF_YEAR, 5);
		Date fechaFinAux = c.getTime();
		if (fechaInicioCd == null || fechaFinCd == null) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"ESCOJA TODOS LOS DATOS PARA PRESENTAR EL REPORTE");
		} else if (fechaFinCd.compareTo(fechaInicioCd) < 0) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"LA FECHA FIN NO PUEDE SER MENOR A LA FECHA INICIO");
		} else if (fechaFinCd.compareTo(fechaFinAux) > 0) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"LA FECHA FIN DEBER SER MAYOR EN 6 DIAS A LA FECHA INICIO");
		} else {
			Map<String, Object> parametro = new HashMap<String, Object>();
			List<Fechas> listaFechas = calcularFechas(1, 2014, 01,
					fechaInicioCd, fechaFinCd);
			/* LISTA DE 3 BOTELLONES */
			List<VolumenVentaProductoSemana> listaBotellones = new ArrayList<>();
			listaBotellones.add((VolumenVentaProductoSemana) obtenerRegistro(1,
					listaVcProductos.get(0), listaVcProductos.get(0)
							.getNombreimprimir() + " DISTRIBUIDOR",
					listaVcProductos.get(0).getProductoid(), listaFechas,
					new BigDecimal("0.759"), vendedorCd));
			listaBotellones.get(0).setPrecio(
					valorConIva(new BigDecimal("0.759")));
			listaBotellones.add((VolumenVentaProductoSemana) obtenerRegistro(1,
					listaVcProductos.get(0), listaVcProductos.get(0)
							.getNombreimprimir() + " PROMOCION",
					listaVcProductos.get(0).getProductoid(), listaFechas,
					new BigDecimal("0.803571"), vendedorCd));
			listaBotellones.get(1).setPrecio(
					valorConIva(new BigDecimal("0.803571")));
			listaBotellones.add((VolumenVentaProductoSemana) obtenerRegistro(1,
					listaVcProductos.get(0), listaVcProductos.get(0)
							.getNombreimprimir() + " VECINOS", listaVcProductos
							.get(0).getProductoid(), listaFechas,
					new BigDecimal("0.892857"), vendedorCd));
			listaBotellones.get(2).setPrecio(
					valorConIva(new BigDecimal("0.892857")));
			listaBotellones.add(sumaConsolidadoSemana(listaBotellones));

			/* ENVASES */
			List<VolumenVentaProductoSemana> listaEnvases = new ArrayList<>();
			listaEnvases.add((VolumenVentaProductoSemana) obtenerRegistro(1,
					listaVcProductos.get(1), listaVcProductos.get(1)
							.getNombreimprimir(), listaVcProductos.get(1)
							.getProductoid(), listaFechas, new BigDecimal("0"),
					vendedorCd));
			listaEnvases.get(0).setPrecio(
					valorConIva(listaVcProductos.get(1).getPrecio()));
			listaEnvases.add(null);

			/* LISTA DE OTROS PRODUCTOS */
			List<VolumenVentaProductoSemana> listaOtros = new ArrayList<>();
			for (int i = 2; i < listaVcProductos.size(); i++) {
				listaOtros.add((VolumenVentaProductoSemana) obtenerRegistro(1,
						listaVcProductos.get(i), listaVcProductos.get(i)
								.getNombreimprimir(), listaVcProductos.get(i)
								.getProductoid(), listaFechas, new BigDecimal(
								"0"), vendedorCd));
				listaOtros.get(i - 2).setPrecio(
						valorConIva(listaVcProductos.get(i).getPrecio()));
			}
			listaOtros.add(null);

			/* LISTA FINAL */
			List<ListasVolumenVentaProductoSemana> listado = new ArrayList<>();
			listado.add(new ListasVolumenVentaProductoSemana(0L,
					listaBotellones, listaEnvases, listaOtros));

			parametro.put("MES", fechaFormatoString(fechaInicioCd, "MMMM/yyyy")
					.toUpperCase());
			if (vendedorCd != 0) {
				Persona p = empleadoService
						.obtenerPorEmpleadoCargoId(vendedorCd).getEmpleado()
						.getPersona();
				parametro.put("VENDEDOR", p.getCedula() + "-" + p.getApellido()
						+ " " + p.getNombre());
			} else {
				parametro.put("VENDEDOR", "TODOS");
			}
			for (int i = 0; i < listaFechas.size(); i++) {
				parametro.put("D" + (i + 1), listaFechas.get(i)
						.getFechaInicio());
			}
			reporteService.generarReportePDF(listado, parametro,
					"VolumenVentaSemana");
		}
	}

	public void reporteConsolidadoVentaMensual() {
		if (anioCa == 0) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"ESCOJA TODOS LOS DATOS PARA PRESENTAR EL REPORTE");
		} else {
			Map<String, Object> parametro = new HashMap<String, Object>();
			List<Fechas> listaFechas = calcularFechas(3, anioCa, 01,
					new Date(), new Date());
			/* LISTA DE 3 BOTELLONES */
			List<VolumenVentaProductoAnio> listaBotellones = new ArrayList<>();
			listaBotellones.add((VolumenVentaProductoAnio) obtenerRegistro(3,
					listaVcProductos.get(0), listaVcProductos.get(0)
							.getNombreimprimir() + " DISTRIBUIDOR",
					listaVcProductos.get(0).getProductoid(), listaFechas,
					new BigDecimal("0.759"), vendedorCd));
			listaBotellones.get(0).setPrecio(
					valorConIva(new BigDecimal("0.759")));
			listaBotellones.add((VolumenVentaProductoAnio) obtenerRegistro(3,
					listaVcProductos.get(0), listaVcProductos.get(0)
							.getNombreimprimir() + " PROMOCION",
					listaVcProductos.get(0).getProductoid(), listaFechas,
					new BigDecimal("0.803571"), vendedorCd));
			listaBotellones.get(1).setPrecio(
					valorConIva(new BigDecimal("0.803571")));
			listaBotellones.add((VolumenVentaProductoAnio) obtenerRegistro(3,
					listaVcProductos.get(0), listaVcProductos.get(0)
							.getNombreimprimir() + " VECINOS", listaVcProductos
							.get(0).getProductoid(), listaFechas,
					new BigDecimal("0.892857"), vendedorCd));
			listaBotellones.get(2).setPrecio(
					valorConIva(new BigDecimal("0.892857")));
			listaBotellones.add(sumaConsolidadoAnio(listaBotellones));

			/* ENVASES */
			List<VolumenVentaProductoAnio> listaEnvases = new ArrayList<>();
			listaEnvases.add((VolumenVentaProductoAnio) obtenerRegistro(3,
					listaVcProductos.get(1), listaVcProductos.get(1)
							.getNombreimprimir(), listaVcProductos.get(1)
							.getProductoid(), listaFechas, new BigDecimal("0"),
					vendedorCd));
			listaEnvases.get(0).setPrecio(
					valorConIva(listaVcProductos.get(1).getPrecio()));
			listaEnvases.add(null);

			/* LISTA DE OTROS PRODUCTOS */
			List<VolumenVentaProductoAnio> listaOtros = new ArrayList<>();
			for (int i = 2; i < listaVcProductos.size(); i++) {
				listaOtros.add((VolumenVentaProductoAnio) obtenerRegistro(3,
						listaVcProductos.get(i), listaVcProductos.get(i)
								.getNombreimprimir(), listaVcProductos.get(i)
								.getProductoid(), listaFechas, new BigDecimal(
								"0"), vendedorCd));
				listaOtros.get(i - 2).setPrecio(
						valorConIva(listaVcProductos.get(i).getPrecio()));
			}
			listaOtros.add(null);

			/* LISTA FINAL */
			List<ListasVolumenVentaProductoAnio> listado = new ArrayList<>();
			listado.add(new ListasVolumenVentaProductoAnio(0L, listaBotellones,
					listaEnvases, listaOtros));

			parametro.put("ANIO", String.valueOf(anioCa));

			if (vendedorCa != 0) {
				Persona p = empleadoService
						.obtenerPorEmpleadoCargoId(vendedorCa).getEmpleado()
						.getPersona();
				parametro.put("VENDEDOR", p.getCedula() + "-" + p.getApellido()
						+ " " + p.getNombre());
			} else {
				parametro.put("VENDEDOR", "TODOS");
			}
			reporteService.generarReportePDF(listado, parametro,
					"VolumenVentaAnio");
		}
	}

	public void reporteConsolidadoVentaSemanal() {
		if (anioCm == 0 || mesCm == 0) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"ESCOJA TODOS LOS DATOS PARA PRESENTAR EL REPORTE");
		} else {
			Map<String, Object> parametro = new HashMap<String, Object>();
			List<Fechas> listaFechas = calcularFechas(2, anioCm, mesCm,
					new Date(), new Date());

			/* LISTA DE 3 BOTELLONES */
			List<VolumenVentaProductoMes> listaBotellones = new ArrayList<>();
			listaBotellones.add((VolumenVentaProductoMes) obtenerRegistro(2,
					listaVcProductos.get(0), listaVcProductos.get(0)
							.getNombreimprimir() + " DISTRIBUIDOR",
					listaVcProductos.get(0).getProductoid(), listaFechas,
					new BigDecimal("0.759"), vendedorCd));
			listaBotellones.get(0).setPrecio(
					valorConIva(new BigDecimal("0.759")));
			listaBotellones.add((VolumenVentaProductoMes) obtenerRegistro(2,
					listaVcProductos.get(0), listaVcProductos.get(0)
							.getNombreimprimir() + " PROMOCION",
					listaVcProductos.get(0).getProductoid(), listaFechas,
					new BigDecimal("0.803571"), vendedorCd));
			listaBotellones.get(1).setPrecio(
					valorConIva(new BigDecimal("0.803571")));
			listaBotellones.add((VolumenVentaProductoMes) obtenerRegistro(2,
					listaVcProductos.get(0), listaVcProductos.get(0)
							.getNombreimprimir() + " VECINOS", listaVcProductos
							.get(0).getProductoid(), listaFechas,
					new BigDecimal("0.892857"), vendedorCd));
			listaBotellones.get(2).setPrecio(
					valorConIva(new BigDecimal("0.892857")));
			listaBotellones.add(sumaConsolidadoMes(listaBotellones));

			/* ENVASES */
			List<VolumenVentaProductoMes> listaEnvases = new ArrayList<>();
			listaEnvases.add((VolumenVentaProductoMes) obtenerRegistro(2,
					listaVcProductos.get(1), listaVcProductos.get(1)
							.getNombreimprimir(), listaVcProductos.get(1)
							.getProductoid(), listaFechas, new BigDecimal("0"),
					vendedorCd));
			listaEnvases.get(0).setPrecio(
					valorConIva(listaVcProductos.get(1).getPrecio()));
			listaEnvases.add(null);

			/* LISTA DE OTROS PRODUCTOS */
			List<VolumenVentaProductoMes> listaOtros = new ArrayList<>();
			for (int i = 2; i < listaVcProductos.size(); i++) {
				listaOtros.add((VolumenVentaProductoMes) obtenerRegistro(2,
						listaVcProductos.get(i), listaVcProductos.get(i)
								.getNombreimprimir(), listaVcProductos.get(i)
								.getProductoid(), listaFechas, new BigDecimal(
								"0"), vendedorCd));
				listaOtros.get(i - 2).setPrecio(
						valorConIva(listaVcProductos.get(i).getPrecio()));
			}
			listaOtros.add(null);

			/* LISTA FINAL */
			List<ListasVolumenVentaProductoMes> listado = new ArrayList<>();
			listado.add(new ListasVolumenVentaProductoMes(0L, listaBotellones,
					listaEnvases, listaOtros));

			parametro.put(
					"MES",
					fechaFormatoString(listaFechas.get(0).getFechaInicio(),
							"MMMM/yyyy").toUpperCase());
			for (int i = 0; i < listaFechas.size(); i++) {
				parametro.put(
						"S" + (i + 1),
						fechaFormatoString(listaFechas.get(i).getFechaInicio(),
								"dd").toUpperCase()
								+ "-"
								+ fechaFormatoString(
										listaFechas.get(i).getFechaFin(), "dd")
										.toUpperCase());
			}

			if (vendedorCm != 0) {
				Persona p = empleadoService
						.obtenerPorEmpleadoCargoId(vendedorCm).getEmpleado()
						.getPersona();
				parametro.put("VENDEDOR", p.getCedula() + "-" + p.getApellido()
						+ " " + p.getNombre());
			} else {
				parametro.put("VENDEDOR", "TODOS");
			}
			reporteService.generarReportePDF(listado, parametro,
					"VolumenVentaMes");
		}
	}

	public void reporteVolumenVentaDiaria() {
		Calendar c = GregorianCalendar.getInstance();
		c.setTime(fechaInicio);
		c.add(Calendar.DAY_OF_YEAR, 5);
		Date fechaFinAux = c.getTime();

		if (fechaInicio == null || fechaFin == null
				|| (productoVvpd == null || productoVvpd.getProductoid() == 0)) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"ESCOJA TODOS LOS DATOS PARA PRESENTAR EL REPORTE");
		} else if (fechaFin.compareTo(fechaInicio) < 0) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"LA FECHA FIN NO PUEDE SER MENOR A LA FECHA INICIO");
		} else if (fechaFin.compareTo(fechaFinAux) > 0) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"LA FECHA FIN DEBER SER MAYOR EN 6 DIAS A LA FECHA INICIO");
		} else {
			List<Fechas> listaFechas = calcularFechas(1, 2014, 01, fechaInicio,
					fechaFin);
			List<VolumenVentaProductoSemana> listaVvpd = new ArrayList<>();
			Map<String, Object> parametro = new HashMap<String, Object>();

			for (PersonaCedulaNombre pcn : listaVendedores) {
				listaVvpd.add((VolumenVentaProductoSemana) obtenerRegistro(1,
						productoVvpd,
						pcn.getApellido() + " " + pcn.getNombre(),
						productoVvpd.getProductoid(), listaFechas,
						new BigDecimal("0"), pcn.getId()));
			}

			parametro.put("NOMBREPRODUCTO", productoService
					.obtenerPorProductoId(productoVvpd.getProductoid())
					.getNombreimprimir());
			parametro.put("MES", fechaFormatoString(fechaInicio, "MMMM/yyyy")
					.toUpperCase());
			for (int i = 0; i < listaFechas.size(); i++) {
				parametro.put("D" + (i + 1), listaFechas.get(i)
						.getFechaInicio());
			}
			reporteService.generarReportePDF(listaVvpd, parametro,
					"VolumenVentaProductoSemana");
		}
	}

	public void reporteVolumenVentaMensual() {
		if (anioVvpm == 0
				|| (productoVvpm == null || productoVvpm.getProductoid() == 0)) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"ESCOJA TODOS LOS DATOS PARA PRESENTAR EL REPORTE");
		} else {
			List<Fechas> listaFechas = calcularFechas(3, anioVvpm, 0,
					new Date(), new Date());
			List<VolumenVentaProductoAnio> listaVvpm = new ArrayList<VolumenVentaProductoAnio>();
			Map<String, Object> parametro = new HashMap<String, Object>();
			for (PersonaCedulaNombre pcn : listaVendedores) {
				listaVvpm.add((VolumenVentaProductoAnio) obtenerRegistro(3,
						productoVvpm,
						pcn.getApellido() + " " + pcn.getNombre(),
						productoVvpm.getProductoid(), listaFechas,
						new BigDecimal("0"), pcn.getId()));
			}
			parametro.put("NOMBREPRODUCTO", productoService
					.obtenerPorProductoId(productoVvpm.getProductoid())
					.getNombreimprimir());
			parametro.put("ANIO", String.valueOf(anioVvpm));
			reporteService.generarReportePDF(listaVvpm, parametro,
					"VolumenVentaProductoAnio");
		}
	}

	public void reporteVolumenVentaSemanal() {
		if (anioVvps == 0 || mesVvps == 0
				|| (productoVvps == null || productoVvps.getProductoid() == 0)) {
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"ESCOJA TODOS LOS DATOS PARA PRESENTAR EL REPORTE");
		} else {
			Map<String, Object> parametro = new HashMap<String, Object>();
			List<Fechas> listaFechas = calcularFechas(2, anioVvps, mesVvps,
					new Date(), new Date());
			List<VolumenVentaProductoMes> listaVvps = new ArrayList<VolumenVentaProductoMes>();

			for (PersonaCedulaNombre pcn : listaVendedores) {
				listaVvps.add((VolumenVentaProductoMes) obtenerRegistro(2,
						productoVvps,
						pcn.getApellido() + " " + pcn.getNombre(),
						productoVvps.getProductoid(), listaFechas,
						new BigDecimal("0"), pcn.getId()));
			}
			parametro.put("NOMBREPRODUCTO", productoService
					.obtenerPorProductoId(productoVvps.getProductoid())
					.getNombreimprimir());
			parametro.put(
					"MES",
					fechaFormatoString(listaFechas.get(0).getFechaInicio(),
							"MMMM/yyyy").toUpperCase());
			for (int i = 0; i < listaFechas.size(); i++) {
				parametro.put(
						"S" + (i + 1),
						fechaFormatoString(listaFechas.get(i).getFechaInicio(),
								"dd").toUpperCase()
								+ "-"
								+ fechaFormatoString(
										listaFechas.get(i).getFechaFin(), "dd")
										.toUpperCase());
			}
			reporteService.generarReportePDF(listaVvps, parametro,
					"VolumenVentaProductoMes");
		}
	}

	public void setAnioCa(int anioCa) {
		this.anioCa = anioCa;
	}

	public void setAnioCm(int anioCm) {
		this.anioCm = anioCm;
	}

	public void setAnioVvpm(int anioVvpm) {
		this.anioVvpm = anioVvpm;
	}

	public void setAnioVvps(int anioVvps) {
		this.anioVvps = anioVvps;
	}

	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}

	public void setFechaFinCd(Date fechaFinCd) {
		this.fechaFinCd = fechaFinCd;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	public void setFechaInicioCd(Date fechaInicioCd) {
		this.fechaInicioCd = fechaInicioCd;
	}

	public void setListaProductos(List<Producto> listaProductos) {
		this.listaProductos = listaProductos;
	}

	public void setListaVcProductos(List<Producto> listaVcProductos) {
		this.listaVcProductos = listaVcProductos;
	}

	public void setListaVendedores(List<PersonaCedulaNombre> listaVendedores) {
		this.listaVendedores = listaVendedores;
	}

	public void setMesCm(int mesCm) {
		this.mesCm = mesCm;
	}

	public void setMesVvps(int mesVvps) {
		this.mesVvps = mesVvps;
	}

	public void setProductoVvpd(Producto productoVvpd) {
		this.productoVvpd = productoVvpd;
	}

	public void setProductoVvpm(Producto productoVvpm) {
		this.productoVvpm = productoVvpm;
	}

	public void setProductoVvps(Producto productoVvps) {
		this.productoVvps = productoVvps;
	}

	public void setVendedorCa(int vendedorCa) {
		this.vendedorCa = vendedorCa;
	}

	public void setVendedorCd(int vendedorCd) {
		this.vendedorCd = vendedorCd;
	}

	public void setVendedorCm(int vendedorCm) {
		this.vendedorCm = vendedorCm;
	}

	public VolumenVentaProductoAnio sumaConsolidadoAnio(
			List<VolumenVentaProductoAnio> lista) {
		int sm1 = 0, sm2 = 0, sm3 = 0, sm4 = 0, sm5 = 0, sm6 = 0;
		int sm7 = 0, sm8 = 0, sm9 = 0, sm10 = 0, sm11 = 0, sm12 = 0;
		for (int i = 0; i < lista.size(); i++) {
			sm1 += lista.get(i).getMes1();
			sm2 += lista.get(i).getMes2();
			sm3 += lista.get(i).getMes3();
			sm4 += lista.get(i).getMes4();
			sm5 += lista.get(i).getMes5();
			sm6 += lista.get(i).getMes6();
			sm7 += lista.get(i).getMes7();
			sm8 += lista.get(i).getMes8();
			sm9 += lista.get(i).getMes9();
			sm10 += lista.get(i).getMes10();
			sm11 += lista.get(i).getMes11();
			sm12 += lista.get(i).getMes12();
		}
		return new VolumenVentaProductoAnio(0L, "CANTIDAD",
				new BigDecimal("0"), sm1, sm2, sm3, sm4, sm5, sm6, sm7, sm8,
				sm9, sm10, sm11, sm12);
	}

	public VolumenVentaProductoMes sumaConsolidadoMes(
			List<VolumenVentaProductoMes> lista) {
		int ss1 = 0, ss2 = 0, ss3 = 0, ss4 = 0, ss5 = 0, ss6 = 0;
		for (int i = 0; i < lista.size(); i++) {
			ss1 += lista.get(i).getS1();
			ss2 += lista.get(i).getS2();
			ss3 += lista.get(i).getS3();
			ss4 += lista.get(i).getS4();
			ss5 += lista.get(i).getS5();
			ss6 += lista.get(i).getS6();
		}
		return new VolumenVentaProductoMes(0L, "CANTIDAD", new BigDecimal("0"),
				ss1, ss2, ss3, ss4, ss5, ss6);
	}

	public VolumenVentaProductoSemana sumaConsolidadoSemana(
			List<VolumenVentaProductoSemana> lista) {
		int sd1 = 0, sd2 = 0, sd3 = 0, sd4 = 0, sd5 = 0, sd6 = 0;
		for (int i = 0; i < lista.size(); i++) {
			sd1 += lista.get(i).getD1();
			sd2 += lista.get(i).getD2();
			sd3 += lista.get(i).getD3();
			sd4 += lista.get(i).getD4();
			sd5 += lista.get(i).getD5();
			sd6 += lista.get(i).getD6();
		}
		return new VolumenVentaProductoSemana(0L, "CANTIDAD", new BigDecimal(
				"0"), sd1, sd2, sd3, sd4, sd5, sd6);
	}

}